#Boa:Frame:Frame1

import wx
import wx.grid
import utiles
import consultasBD
from decimal import Decimal

ROJO = (255, 145, 145, 255)
VERDE = (145, 255, 145, 255)
AZUL = (145, 145, 255, 255)
BLANCO = (255, 255, 255, 255)
AMARILLO = (254, 248, 191, 255)
GRIS = ( 220, 220, 220, 255)
NEGRO = ( 0, 0, 0, 255)
VERDENEGRO = ( 47, 79, 79, 255)

def create(parent):
    return Frame1(parent)

[wxID_FRAME1, wxID_FRAME1BUTTON1, wxID_FRAME1BUTTON2, wxID_FRAME1GRID1, 
 wxID_FRAME1PANEL1, 
] = [wx.NewId() for _init_ctrls in range(5)]

class Frame1(wx.Frame):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt,
              pos=wx.Point(369, 121), size=wx.Size(967, 285),
              style=wx.DEFAULT_FRAME_STYLE, title='Cheques Borrar - APROBAR')
        self.SetClientSize(wx.Size(959, 258))

        self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1, name='panel1', parent=self,
              pos=wx.Point(0, 0), size=wx.Size(959, 258),
              style=wx.TAB_TRAVERSAL)

        self.grid1 = wx.grid.Grid(id=wxID_FRAME1GRID1, name='grid1',
              parent=self.panel1, pos=wx.Point(8, 16), size=wx.Size(944, 200),
              style=0)
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_LEFT_DCLICK,
              self.OnSeleccionarRenglon)

        self.button1 = wx.Button(id=wxID_FRAME1BUTTON1, label='Procesar',
              name='button1', parent=self.panel1, pos=wx.Point(8, 224),
              size=wx.Size(75, 23), style=0)
        self.button1.Bind(wx.EVT_BUTTON, self.OnProcesar, id=wxID_FRAME1BUTTON1)

        self.button2 = wx.Button(id=wxID_FRAME1BUTTON2, label='Salir',
              name='button2', parent=self.panel1, pos=wx.Point(872, 224),
              size=wx.Size(75, 23), style=0)
        self.button2.Bind(wx.EVT_BUTTON, self.OnSalir, id=wxID_FRAME1BUTTON2)

    def __init__(self, parent):
        self._init_ctrls(parent)
        self.crearGrilla()
        self.cargarGrilla()

    def crearGrilla(self):
        #nroChq,FchaE,FchaP,Imp,Dest,Mot,Apr,id1,id2
        #0      1     2     3   4    5   6   7   8
        columnas = ['Nro.\nCheque','Fecha\nEmision','Fecha\nPago',\
                    'Importe','Destinatario','Motivo','Aprobar\nBorrado','id1','id2']
        self.grid1.CreateGrid(1,len(columnas))
        for i, col in enumerate(columnas): 
            self.grid1.SetColLabelValue(i, col)
        self.ajustarAnchoColumnas()
        self.grid1.EnableEditing(False)
        self.grid1.SetSelectionMode(wx.grid.Grid.wxGridSelectRows)
        self.grid1.Refresh()

    def ajustarAnchoColumnas(self):
        for y in xrange(self.grid1.GetNumberCols()):
            self.grid1.AutoSizeColumn(y,True)

    def OnSalir(self, event):
        self.Close()

    def cargarGrilla(self):
        sql = "SELECT * FROM chq_borrados WHERE borrado = '0' "
        resultados = consultasBD.ordenCrudaDict(sql)
        if resultados==0 or resultados==None or len(resultados)==0:
            utiles.mensaje(None,"No hay cheques pendientes de aprobacion")
            self.button2.SetFocus()
            return
        
        fila = 0
        for cheque in resultados:
            id1 = str(cheque["id"])
            id2 = str(cheque["id_original"])
            nrocheque = str(cheque["nrocheque"])
            fechaemision = str(cheque["fechaemision"])
            fechapago = str(cheque["fechapago"])
            importe = str(cheque["importe"])
            destinatario = str(cheque["destinatario"])
            motivo = str(cheque["motivo"])
            
            #nroChq,FchaE,FchaP,Imp,Dest,Mot,Apr,id1,id2
            #0      1     2     3   4    5   6   7   8
            self.grid1.SetCellValue(fila,0,nrocheque)
            self.grid1.SetCellValue(fila,1,fechaemision)
            self.grid1.SetCellValue(fila,2,fechapago)
            self.grid1.SetCellValue(fila,3,importe)
            self.grid1.SetCellValue(fila,4,destinatario)
            self.grid1.SetCellValue(fila,5,motivo)
            self.grid1.SetCellValue(fila,6,"PENDIENTE")
            self.grid1.SetCellValue(fila,7,id1)
            self.grid1.SetCellValue(fila,8,id2)
        
            self.grid1.SetCellAlignment(fila,0,wx.ALIGN_RIGHT,wx.ALIGN_RIGHT)
            self.grid1.SetCellAlignment(fila,1,wx.ALIGN_RIGHT,wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fila,2,wx.ALIGN_RIGHT,wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fila,3,wx.ALIGN_RIGHT,wx.ALIGN_RIGHT)
            self.grid1.SetCellAlignment(fila,7,wx.ALIGN_RIGHT,wx.ALIGN_RIGHT)
            self.grid1.SetCellAlignment(fila,8,wx.ALIGN_RIGHT,wx.ALIGN_RIGHT)
            
            self.grid1.AppendRows()
            fila = fila + 1
    
        self.ajustarAnchoColumnas()

    def OnSeleccionarRenglon(self, event):
        fila = self.grid1.GetGridCursorRow()
        color = BLANCO
        #nroChq,FchaE,FchaP,Imp,Dest,Mot,Apr,id1,id2
        #0      1     2     3   4    5   6   7   8
        if self.grid1.GetCellBackgroundColour(fila,0)==BLANCO:
            color=VERDE
            self.grid1.SetCellValue(fila,6,"APROBADO")
        if self.grid1.GetCellBackgroundColour(fila,0)==VERDE:
            color=ROJO
            self.grid1.SetCellValue(fila,6,"RECHAZAR")
        if self.grid1.GetCellBackgroundColour(fila,0)==ROJO:
            color=BLANCO
            self.grid1.SetCellValue(fila,6,"PENDIENTE")

        for col in xrange(self.grid1.GetNumberCols()):
            self.grid1.SetCellBackgroundColour(fila,col,color)

        self.grid1.Refresh()

    def OnProcesar(self, event):
        filas = self.grid1.GetNumberRows()-1
        #nroChq,FchaE,FchaP,Imp,Dest,Mot,Apr,id1,id2
        #0      1     2     3   4    5   6   7   8
        for fil in xrange(filas):
            if self.grid1.GetCellValue(fil,0) == "": continue

            aprobado = self.grid1.GetCellValue(fil,6)
            
            if aprobado == "PENDIENTE": continue
            if aprobado == "APROBADO":
                self.borrarCheque(fil)
            else:
                self.anularBorrado(fil) #RECHAZAR = implica que no se borrara el cheque

        self.grid1.ClearGrid()
        for fil in xrange(filas):
            self.grid1.DeleteRows()
        self.cargarGrilla()

    def borrarCheque(self, fil):
        #nroChq,FchaE,FchaP,Imp,Dest,Mot,Apr,id1,id2
        #0      1     2     3   4    5   6   7   8
        
        nrocheque = str(self.grid1.GetCellValue(fil,0))
        
        #borramos definitavemente el cheque de la tabla de emitidos
        id_original = str(self.grid1.GetCellValue(fil,8))
        sql1 = "DELETE FROM chq_emitidos WHERE id = '"+id_original+"' "
        
        #marcamos como borrado el chq de la tabla borrados
        id = str(self.grid1.GetCellValue(fil,7))
        r1 = "UPDATE chq_borrados SET borrado = '1' WHERE "
        r2 = "id = '"+id+"' AND id_original='"+id_original+"' AND borrado = '0'"
        sql2 = r1+r2

        #verifica que el cheque haya sido utilizado en pagos a proveedores
        r1 = "SELECT * FROM comprasaldos WHERE idoperacion "
        r2 = "LIKE '%CHEQUES "+nrocheque+"%' ORDER BY fecha DESC LIMIT 1 "
        sql = r1+r2
        resultado = consultasBD.ordenCrudaDict(sql)
        if len(resultado) != 1 or resultado == None or resultado == ():
            a1 = "Cheque no utilizado para pago a proveedores\n"
            a2 = "No se encuentra informacion en Saldo de Proveedores"
            texto = a1 + a2
            utiles.mensaje(None,texto)
            self.textCtrl1.SetFocus()
            self.textCtrl1.SetEditable(True)
            return
        chequepago = resultado[0]

        #extrae los datos del movimiento compras saldo para hacer el ajuste
        idoperacion = "AJUSTE"
        fecha = utiles.obtenerFecha("Y-m-d h:m:s")
        idproveedor = str(chequepago["idproveedor"])
        monto1 = str(chequepago["monto1"])
        monto2 = str(chequepago["monto2"])
        tipodoc = "7"
        nrofactura = str(chequepago["nrofactura"])
        cantproductos = str(chequepago["cantproductos"])
        idforma1o2 = str(chequepago["idforma1o2"])
        observaciones = "ANULA CHQ "+nrocheque+" / "+str(self.grid1.GetCellValue(fil,5))
        operador = ""
        temporada = str(chequepago["temporada"])
        idregistro = "-1"

        r1 = "INSERT INTO comprasaldos(idoperacion,fecha,idproveedor,monto1,\n"
        r2 = "       monto2,tipodoc,nrofactura,cantproductos,idforma1o2,\n"
        r3 = "       observaciones,operador,temporada,idregistro) \n"
        r4 = "VALUES ('"+idoperacion+"','"+fecha+"','"+idproveedor+"',\n"
        r5 = "        '"+monto1+"','"+monto2+"','"+tipodoc+"','"+nrofactura+"',\n"
        r6 = "        '"+cantproductos+"','"+idforma1o2+"','"+observaciones+"',\n"
        r7 = "        '"+operador+"','"+temporada+"','"+idregistro+"')"
        sql3 = r1+r2+r3+r4+r5+r6+r7

        try:
            consultasBD.begin()
            consultasBD.executaSinCommit(None, sql1)
            consultasBD.executaSinCommit(None, sql2)
            consultasBD.executaSinCommit(None, sql3)
            consultasBD.commit()
        except:
            consultasBD.rollback()
            utiles.mensaje(None,"Error al intentar borrar el cheque "+nrocheque)
    
    def anularBorrado(self,fil):
        #nroChq,FchaE,FchaP,Imp,Dest,Mot,Apr,id1,id2
        #0      1     2     3   4    5   6   7   8
        nrocheque = str(self.grid1.GetCellValue(fil,0))
        
        #el cheque marcado para ser borrado al final no sera borrado. 
        #entonces lo marcamos para que no nos aparezca mas.
        id = str(self.grid1.GetCellValue(fil,7))
        id_original = str(self.grid1.GetCellValue(fil,8))
        r1 = "UPDATE chq_borrados SET borrado = '2' WHERE "
        r2 = "id = '"+id+"' AND id_original='"+id_original+"' AND borrado = '0'"
        sql1 = r1+r2
    
        try:
            consultasBD.begin()
            consultasBD.executaSinCommit(None, sql1)
            consultasBD.commit()
        except:
            consultasBD.rollback()
            utiles.mensaje(None,"Error al intentar anular el\nborrado del cheque "+nrocheque)
